共计 2494 个字符,预计需要花费 7 分钟才能阅读完成。
提醒:本文最后更新于 2024-08-29 10:16,文中所关联的信息可能已发生改变,请知悉!
讨论纪要
- 设多尺度指数为 k(k = 1, 2, 3……)
- 遍历图像(每次都取 3 * 3 的九宫格为研究单位)
- 统计每个单位内存在噪声的个数的分布情况
图片素材
原图:
噪声图(20% 噪声):
测试代码
# python3.8
# utf-8
# 统计噪声分布情况
import cv2 as cv
import numpy as np
def shrink(channel, k):
"""
:param channel: 像素通道
:param k: 多尺度指数
:return: 小矩阵
"""
if k == 1:
return channel
row, col = np.array(channel).shape
result = []
for i in range(k):
for j in range(k):
result0 = [[0] * (col // k) for ri in range(row // k)]
for m in range(row // k):
for n in range(col // k):
if 0 <= m * k + (i - 1) * k < row and 0 <= n * k + (j - 1) * k < col:
result0[m][n] = channel[m * k + (i - 1) * k][n * k + (j - 1) * k]
result.append(result0)
return result
def cmp0(channel1, channel2, cnt):
"""
:param channel1: 像素通道 1
:param channel2: 像素通道 2
:param cnt: 统计数组
:return: cnt
"""
row, col = np.array(channel1).shape
for i in range(1, row - 1):
for j in range(1, col - 1):
cnt0 = 0
for m in range(3):
for n in range(3):
if 0 <= i + m < row and 0 <= j + n < col:
if channel1[i + m][j + n] != channel2[i + m][j + n]:
cnt0 += 1
cnt[cnt0] += 1
return cnt
def cmp(origin, noise, k, cnt):
"""
:param origin: 原图的某一通道
:param noise: 噪声图像的某一通道
:param k: 多尺度指数
:param cnt: cnt
:return: new cnt
"""
shrinked_origin = shrink(origin, k)
shrinked_noise = shrink(noise, k)
for i in range(k * k):
if k == 1:
cnt = cmp0(shrinked_origin, shrinked_noise, cnt)
else:
cnt = cmp0(shrinked_origin[i], shrinked_noise[i], cnt)
return cnt
def main(origin, noise, k):
"""
:param origin: 原图地址
:param noise: 噪声图地址
:param k: 多尺度指数
:return:
"""
# 建立统计数组,统计 0 个到 9 个噪声点的次数
cnt = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
img_origin = cv.imread(origin, 1)
img_noise = cv.imread(noise, 1)
b_origin, g_origin, r_origin = cv.split(img_origin)
b_noise, g_noise, r_noise = cv.split(img_noise)
cnt = cmp(b_origin, b_noise, k, cnt)
cnt = cmp(g_origin, g_noise, k, cnt)
cnt = cmp(r_origin, r_noise, k, cnt)
return cnt
if __name__ == '__main__':
origin_addr = 'img.png'
noise_addr = 'img_noise.png'
ki = 20
for i in range(1, ki):
print(i, ': ', main(origin_addr, noise_addr, i))
结果
1 : [37913, 57693, 37883, 14758, 3597, 637, 63, 6, 0, 0]
2 : [37846, 56020, 37246, 13848, 3574, 566, 76, 8, 0, 0]
3 : [38391, 54542, 35782, 13314, 3150, 648, 27, 0, 0, 0]
4 : [41556, 52310, 33718, 11641, 3167, 168, 0, 0, 0, 0]
5 : [36854, 49566, 32374, 14177, 4828, 765, 111, 0, 0, 0]
6 : [43444, 47958, 30239, 11964, 2043, 432, 0, 0, 0, 0]
7 : [46230, 46478, 28256, 9866, 1029, 441, 0, 0, 0, 0]
8 : [50508, 42172, 24850, 10246, 1392, 624, 0, 0, 0, 0]
9 : [46914, 37518, 26088, 12972, 3813, 1242, 0, 0, 0, 0]
10 : [53463, 41171, 19412, 4646, 1068, 240, 0, 0, 0, 0]
11 : [52524, 38412, 16932, 6822, 2643, 279, 0, 0, 0, 0]
12 : [65424, 29631, 14661, 6492, 1026, 270, 0, 0, 0, 0]
13 : [75999, 22551, 8235, 4530, 2052, 708, 0, 0, 0, 0]
14 : [79663, 21724, 10942, 2589, 330, 0, 0, 0, 0, 0]
15 : [77481, 19605, 11124, 3819, 1686, 360, 0, 0, 0, 0]
16 : [87633, 17988, 3285, 1356, 330, 0, 0, 0, 0, 0]
17 : [92328, 6741, 3807, 1782, 249, 0, 0, 0, 0, 0]
18 : [81849, 5629, 6010, 2776, 693, 243, 0, 0, 0, 0]
19 : [88299, 6501, 1809, 861, 0, 0, 0, 0, 0, 0]